package com.tedu.submarine;

import javax.swing.*;
import java.awt.*;
import java.util.Random;

/*
* 海洋类  是所有类的父类
* * */
public abstract class SeaObject {

    /**
     * 活着的
     */
    public static final int LIVE = 0;

    /**
     * 死了的
      */
    public static final int DEAD = 1;
    /**
     * 当前状态 默认活着的
     */
    private int state = LIVE;

    private int width; //所有对象的宽度
    private int height;//所有对象的高度
    private int x;//表示所有对象的x坐标
    private int y;//表示所有对象的y坐标
    private int speed;//表示所有对象移动的速度

    //因为三种潜艇的width/heigth都是不一样的，所以数据不可以写死
    //因为三种潜艇的初始的x y  speed 都是一行的 所以数据可以写死
    /**
    * 专门给侦查潜艇 鱼雷潜艇 水雷潜艇提供的父类的构造方法
    * @param  width 表示潜艇的宽度
    * @param  height 表示潜艇的高度
    * */
    public SeaObject(int width,int height){
        this.width = width;
        this.height = height;
        //x的位置
        x = -width;
        //y的位置是随机的对象
        //创建Random随机对象
        Random rand = new Random();
        //y的高度时界面的高度-150-height+1  +150
        //+1表示取不到最后的一个值所以加+1刚好取到界面的高度-150-height
        y = rand.nextInt(World.HEIGHT-height-150+1)+150;
        //速去是1-3之间
        speed = rand.nextInt(3)+1;

    }

    /**
    * 因为战舰 水雷 炸弹 的 width height x y speed 都是不一样的所以数据不能写死 需要传活
    * */
    /**
    * 专门给战舰  水雷 炸弹提供的构造方法
    * @param width 表示宽度
    * @param height 表示高度
    * @param x x坐标
    * @param y y坐标
    * @param speed 速度
    * */
    public SeaObject(int width,int height,int x,int y,int speed){
        this.width=width;
        this.height=height;
        this.x = x;
        this.y = y;
        this.speed = speed;
    }

    /**
    * 设置对象的方法为抽象方法 父类不需要方法实现
    * */
    public abstract  void move();

    /**
    *
    * 设置获取对象的图片
    * */
    public abstract ImageIcon getImage();


    /**
     * 判断对象是否是活着的
     * @return 返回true表示活着的，否则表示死了的
     */
    public boolean isLive(){
        return state==LIVE; //若state为LIVE，表示活着的，返回true，否则返回false
    }

    /**
     * 判断对象是否是死了的
     * @return 返回true表示死了的，否则表示活着的
     */
    public boolean isDead(){
        return state==DEAD; //若state为DEAD，表示死了的，返回true，否则返回false
    }

    public void paintImage(Graphics graphics){
        if (this.isLive()){//若活着的
            //使用画笔对象 画出
            this.getImage().paintIcon(null, graphics, this.x, this.y);
        }
    }

    /**
     * 检测潜艇是否越界
     * @return 若越界则返回true 否则返回false
     */
    public boolean isOutOfBounds(){
        return this.x >= World.WIDTH;//潜艇的x >= 窗口 的宽度 表现为越界了
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    /**
     * 检测碰撞
     * @param other other 另一个对象 this 当前对象
     * @return 撞上了返回true  否则返回false
     */
    public  boolean isHit(SeaObject other){
        /**
         * 假设 this为潜艇 other 为炸弹
         */
        int x1 = this.x - other.width;//x1 潜艇的x-炸弹的宽度
        int x2 = this.x + other.width;//x2 潜艇的x+炸弹的宽度
        int y1 = this.y - other.height;//y1 潜艇的y-炸弹的高度
        int y2 = this.y + other.height;//y2 潜艇的y+炸弹的高度
        int x = other.x;//x 炸弹x坐标
        int y = other.y;//y 炸弹y坐标

        return x >= x1 && x <= x2
                &&
                y>= y1 && y<=y2;  // x 在x1 与x2 之间 并且y在y1和y2之间表示账上了
    }

    /**
     * 海洋对象去死
     */
    public void goDead(){
        state = DEAD;//将当前状态修改为DEAD
    }
}
